package cn.lzy.demo;

import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @Description  Java代码配置
 * @Author lzy
 * @Date 2023/12/4 10:31
 * @Version
 **/
public class TestDemoJava {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        // 我们关于 Bean 的配置，都会被先解析为 BeanDefinition

        // === 1. 定义公共属性的类 ===
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClass(Animal.class);
        MutablePropertyValues rootPropertyValues = new MutablePropertyValues();
        rootPropertyValues.add("category", "猫科");
        // 这是给Bean定义的属性值赋值（即是给 Animal 中各个属性设置值的）
        rootBeanDefinition.setPropertyValues(rootPropertyValues);
        // 向容器注册公共类定义
        ctx.registerBeanDefinition("public", rootBeanDefinition);

        // === 2. 定义基础类 ===
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(Cat.class);
        MutablePropertyValues childPropertyValues = new MutablePropertyValues();
        childPropertyValues.add("name", "花猫");
        genericBeanDefinition.setPropertyValues(childPropertyValues);
        // 设置该定义的公共属性bean
        genericBeanDefinition.setParentName("public");
        ctx.registerBeanDefinition("child", genericBeanDefinition);

        ctx.refresh();

        // === 3.刷新容器 ===
        Cat cat = ctx.getBean(Cat.class);
        System.out.println("cat = " + cat);
    }
}
